
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package myftp.app.model;

import javax.swing.JButton;
import javax.swing.JProgressBar;
import javax.swing.table.AbstractTableModel;
import myftp.app.view.TransfertView;
import myftp.core.Template;

/**
 *
 * @author CAVARLE Glenn, LUCAS Stéphane
 * Model pour le tableau des transferts
 */
public class TransfertTableModel extends AbstractTableModel {

    public String[] columnNames = {
        "Serveur", "Fichier", "Statut", "Progression", "Temporisation", "Annulation"};
    final Class[] columnClasses = {
        String.class, String.class, String.class,
        JProgressBar.class, JButton.class, JButton.class};
    public Object[][] transferts = null;

    public TransfertTableModel() {
        super();
    }

    /**
     * Ajoute un tranfert
     * @param serveurName
     * @param fileName
     * @return nombre_de_transfert
     */
    public int addTransfert(String serveurName, String fileName) {

        int colNb = getColumnCount();
        int rowNb = getRowCount();

        Object[][] newTransferts = new Object[rowNb + 1][colNb];

        for (int col = 0; col < colNb; col++) {
            for (int row = 0; row < rowNb; row++) {
                newTransferts[row][col] = getValueAt(row, col);
            }
        }

        /* Ajout d'une ligne au tableaux des transferts */
        newTransferts[rowNb][0] = serveurName;
        newTransferts[rowNb][1] = fileName;
        newTransferts[rowNb][2] = "En cours...";
        newTransferts[rowNb][3] = new Float(0);
        newTransferts[rowNb][4] = new JButton("Pause");
        newTransferts[rowNb][5] = new JButton("Stop");

        setTransferts(newTransferts);
        /* Raffraichissement de l'affichage de la ligne */
        this.refreshLigne(rowNb);
        /* Mise à jour de la taille du tableau */
        this.doResize();

        return rowNb;
    }

    /**
     * Annulation d'un transfert
     * @param index
     * @return boolean
     */
    public boolean stopTransfert(int index) {
        try {
            setValueAt("Annulé", index, 2);
        } catch (IndexOutOfBoundsException Iob) {
            return false;
        }
        this.refreshLigne(index);

        return true;
    }

    /**
     * Mise en pause d'un transfert
     * @param index
     * @return boolean
     */
    public boolean pauseTransfert(int index) {
        try {
            setValueAt("En attente...", index, 2);
        } catch (IndexOutOfBoundsException Iob) {
            return false;
        }
        this.refreshLigne(index);

        return true;
    }

    /**
     * Termine un transfert
     * @param index
     * @return boolean
     */
    public boolean closeTransfert(int index) {
        try {
            setValueAt("Terminé", index, 2);
        } catch (IndexOutOfBoundsException Iob) {
            return false;
        }
        this.refreshLigne(index);
        this.updateBar(index, new Float(100));

        return true;
    }

    /**
     * Reprend d'un transfert
     * @param index
     * @return boolean
     */
    public boolean restartTransfert(int index) {
        setValueAt("En cours...", index, 2);
        this.refreshLigne(index);

        return true;
    }

    /**
     * Mise à jour de la barre de progression
     * @param index
     * @param progression
     * @return boolean
     */
    public boolean updateBar(int index, Float progression) {
        setValueAt(progression, index, 3);
        this.refreshLigne(index);

        return true;
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        /* Les cellules sont éditables uniquement lorsque des boutons sont présents */

        /* C'est à dire seulement pour les deux dernière colonnes
        et lorsque le transfert n'est pas terminé (ou annulé) */

        if (column < 4
                || getValueAt(row, 2).equals("Annulé")
                || getValueAt(row, 2).equals("Terminé")) {
            return false;

        } else {
            return true;
        }
    }

    /**
     * Retourne le nombre de colonne
     * @return int
     */
    public int getColumnCount() {
        return columnNames.length;
    }

    /**
     * Retourne le nombre de ligne
     * @return int
     */
    public int getRowCount() {
        try {
            return transferts.length;
        } catch (NullPointerException Npe) {
            return 0;
        }
    }

    /**
     *  Retourne le nom de la colonne col
     * @param col
     * @return String
     */
    public String getColumnName(int col) {
        return columnNames[col];
    }

    /**
     * Renvoi l'objet a la position (row, col)
     * @param row
     * @param col
     * @return Object
     */
    public Object getValueAt(int row, int col) {
        try {
            return transferts[row][col];
        } catch (ArrayIndexOutOfBoundsException Oob) {
            return "";
        }
    }

    /**
     * Retourne la classe de la colonne col
     * @param col
     * @return Class
     */
    public Class getColumnClass(int col) {
        return columnClasses[col];
    }

    public void setValueAt(Object value, int row, int col) {
        try {
            transferts[row][col] = value;
        } catch (NullPointerException Npe) {
            System.out.println("! Thread d'affichage trop rapide !");
        } catch (ArrayIndexOutOfBoundsException aIOb) {
            System.out.println("! Thread d'affichage trop rapide !");
        }
        fireTableCellUpdated(
                row, col);
    }

    /**
     *  Rafraichissement de toute la ligne aRow
     * @param aRow
     */
    public void refreshLigne(int aRow) {
        for (int aCol = 0; aCol < getColumnCount(); aCol++) {
            fireTableCellUpdated(aRow, aCol);
        }
    }

    /**
     * Redimmensionnement de la taille du tableau
     */
    public void doResize() {
        try {
            ((TransfertView) Template.getInstance().getViewPart("transfertView")).getScroller().doResize();
        } catch (NullPointerException npe) {
        }
    }

    /**
     * getter transferts
     * @return transferts
     */
    public Object[][] getTransferts() {
        return transferts;
    }

    /**
     * setter transferts
     * @param aTransfertsTable
     */
    public void setTransferts(Object[][] aTransfertsTable) {
        this.transferts = aTransfertsTable;
    }
}

